/*
 * Classe responsável por toda a comunicação entre o banco de dados.
 * Possui um método para conectar ao banco, outro para encerrar a comunicação com o banco e
 * outro para inserir dados no banco.
 * Implementa a biblioteca JDBC.
 */
package rejahealth.util;
import java.sql.*;
import rejahealth.model.Person;

public class Sql 
{
    static final String DATABASE_URL = "jdbc:mysql://localhost:3306/rejahealth";// emdereço do banco de dados
    static public Connection connection = null;// variável responsável pela conexão com o banco
    public static PreparedStatement ins = null; // variável que monta as querys de acordo com os
    //dados recebidos.
    Statement statement = null;
    ResultSet resultSet = null;
    /* método de conexão com o banco de dados. Retorna variável connection da classe Connection.
     * Não recebe argumentos. Caso falhe, trata exceção com try-catch e retorna 0.
    */
    public static Connection conectarBanco() {
        connection = null;
        try {
            connection = DriverManager.getConnection(DATABASE_URL, "root", "root");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    // Método que recebe a conexão do banco e a encerra. Recebe como argumentos: 
    //Connection connection, Statement statement, ResultSet resultSet
    public static void disconnect(Connection connection, Statement statement, ResultSet resultSet) {
        try {
            resultSet.close();
            statement.close();
            connection.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public Person resultSetToPerson(ResultSet rs) {
    	if(rs == null) return null;
    	Person person = new Person();
    	try {
            person.setAge(Integer.parseInt(rs.getString("age")));
	    person.setFat(Double.parseDouble(rs.getString("fat")));
	    person.setHeight(Integer.parseInt(rs.getString("height")));
	    person.setHumidity(Double.parseDouble(rs.getString("humidity")));
	    person.setHydration(Double.parseDouble(rs.getString("hydration")));
	    person.setSex(rs.getString("sex"));
	    person.setTemperature(Double.parseDouble(rs.getString("temperature")));
	    person.setWeight(Double.parseDouble(rs.getString("weight")));
	    return person;
    	} catch (NumberFormatException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	}
    	return null;
    }
    /*
     * Método que faz uso de statements previamente preparados para inserir dados no banco de dados.
     */
    public static int insert(String age, String height, String weight, String sex, String fat, String hydration, String humidity, String temperature) {
        int confirma = 0;
        try { 
            ins = connection.prepareStatement("INSERT INTO rejahealth.park (age, height, weight, sex, fat, hydration, humidity, temperature) VALUES(?,?,?,?,?,?,?,?)");// Statement previamente preparado.
            ins.setString(1, age);// Substitui a primeira interrogação da string pela variável idade
            ins.setString(2, height);// Substitui a segunda interrogação da string pela variável altura
            ins.setString(3, weight);// Substitui a terceira interrogação da string pela variável peso
            ins.setString(4, sex);// Substitui a quarta interrogação da string pela variável sexo
            ins.setString(5, fat);// Substitui a primeira interrogação da string pela variável gordura
            ins.setString(6, hydration);// Substitui a segunda interrogação da string pela variável hidratação
            ins.setString(7, humidity);// Substitui a terceira interrogação da string pela variável umidade
            ins.setString(8, temperature);// Substitui a quarta interrogação da string pela variável temperatura
            
            confirma = ins.executeUpdate();//Executa a query do prepared statement
        } catch(SQLException e) {
            e.printStackTrace();
        }
        return(confirma);// retorna 1 se a query for executada e 0 caso de erro.
    }
    
    public Person search(String idade, String altura, String peso, String sexo, String gordura, String hidratacao, String umidade, String temperatura) {
        try {
            String querry = "SELECT age, height, weight, sex, fat, hydration, humidity, temperature FROM rejahealth.park WHERE ";
            if (idade != null)
                querry = querry + "age LIKE '" + idade +"%";
            
            if (altura != null)
                querry = querry + "height LIKE '" + altura +"%";
            
            if (peso != null)
                querry = querry + "weight LIKE '" + peso +"%";
            
            if (sexo != null)
                querry = querry + "sex LIKE '" + sexo +"%"; 
            
            if (gordura != null)
                querry = querry + "fat LIKE '" + gordura +"%";
            
            if (hidratacao != null)
                querry = querry + "hydration LIKE '" + hidratacao +"%";

            if (umidade != null)
                querry = querry + "humidity LIKE '" + umidade +"%";              

            if (temperatura != null)
                querry = querry + "temperature LIKE '" + temperatura +"%"; 

            statement = connection.createStatement();
            resultSet = statement.executeQuery(querry);
        } catch (SQLException e) {
           e.printStackTrace();
        }
        return resultSetToPerson(resultSet);
    }
    
    public Person getById(Integer id) {
    	try {
            Person person = new Person();
            ins = connection.prepareStatement("SELECT * FROM rejahealth.park WHERE id = ?");
            ins.setInt(1, id);
            ResultSet rs = ins.executeQuery();
            if (rs.next()) {
            	person = resultSetToPerson(rs);
            }
            connection.close();
            ins.close();
            return person;
    	} catch (SQLException e) {
            e.printStackTrace();
    	}
	return null;
    }
    
}